#include "adc.h"
/* 字符串转数字，将浮点小数字符串转换为浮点数数值 */
/*
    * @ret:通过file_data_read得到返回值
    * @index:通过枚举的输入值
    * @str:通过file_data_read得到返回值
    * @member:输入值
*/
#define SENSOR_FLOAT_DATA_GET(ret, index, str, member) \
ret = file_data_read(file_path[index], str); \
dev->member = atof(str); \

/* 字符串转数字，将整数字符串转换为整数数值 */
#define SENSOR_INT_DATA_GET(ret, index, str, member) \
ret = file_data_read(file_path[index], str); \
dev->member = atoi(str); \

/* adc iio 框架对应的文件路径 */
static char *file_path[] = {
"/sys/bus/iio/devices/iio:device0/in_voltage_scale",
"/sys/bus/iio/devices/iio:device0/in_voltage6_raw",
};

struct adc_dev myadc;
/*
* @description : 读取指定文件内容
* @param – filename : 要读取的文件路径
* @param - str : 读取到的文件字符串
* @return : 0 成功;其他 失败
*/
int file_data_read(char *filename, char *str)
{
    int ret = 0;
    FILE *data_stream;
    data_stream = fopen(filename, "r"); /* 只读打开 */
    if(data_stream == NULL) {
        printf("can't open file %s\r\n", filename);
        return -1;
    }
    ret = fscanf(data_stream, "%s", str);
    if(!ret) {
        printf("file read error!\r\n");
    } else if(ret == EOF) {
        /* 读到文件末尾的话将文件指针重新调整到文件头 */
        fseek(data_stream, 0, SEEK_SET);
    }
    fclose(data_stream); /* 关闭文件 */
    return 0;
}

/*
* @description : 获取 ADC 数据
* @param - dev : 设备结构体
* @return : 0 成功;其他 失败
*/
int adc_read(struct adc_dev *dev)
{
    int ret = 0;
    char str[50];

    SENSOR_FLOAT_DATA_GET(ret, IN_VOLTAGE_SCALE, str, scale);
    SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_RAW, str, raw);

    /* 转换得到实际电压值 mV */
    dev->act = (dev->scale * dev->raw)/1000.f;
    return ret;
}
